package wodegua.d31_java高级.d2_reflect;

import java.lang.reflect.Constructor;

/**
 * 获取类的构造器、并对其进行操作
 * Class提供了从类中获取构造器的方法。
 * 方法
 * Constructor<?> [] getConstructors()    获取全部构造器(只能获取public修饰的)
 * Constructor<?> [] getDeclaredConstructors()    获取全部构造器(只要存在就能拿到)
 * Constructor<T> getConstructor(Class<?>... parameterTypes)     获取某个构造器(只能获取public修饰的)
 * Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)      获取某个构造器(只要存在就能拿到)
 *
 * 获取类构造器的作用:依然是初始化对象返回
 * Constructor提供的方法
 * T newInstance(Object... initargs)    调用此构造器对象表示的构造器，并传入参数，完成对象的初始化并返回
 * public void setAccessible(boolean flag)   设置为true，表示禁止检查访问控制(暴力反射)
 */
public class Test2Constructor {
    public static void main(String[] args) throws Exception {
        Class c = Student.class;

        Constructor[] c0 = c.getConstructors();
        for (Constructor constructor : c0) {
            System.out.println(constructor.getName() + "---" + constructor.getParameterCount());
        }

        System.out.println("------------------------------------");

        Constructor[] c1 = c.getDeclaredConstructors();
        for (Constructor constructor : c1) {
            System.out.println(constructor.getName() + "---" + constructor.getParameterCount());
        }

        System.out.println("------------------------------------");

//        Constructor c2 = c.getConstructor(String.class, int.class);
        Constructor c2 = c.getDeclaredConstructor(String.class, int.class);
        c2.setAccessible(true);
        Student s1 = (Student) c2.newInstance("张三", 18);
        System.out.println(c2.getName() + "--->" + c2.getParameterCount());
        System.out.println(s1.getName() + "-->" + s1.getAge());

    }
}
